What is DDD?

What is DDD?

一、 是什么?

DDD (domain driven design) 领域驱动设计 是一种通过将实现连接到持续进化的模型来满足复杂需求的软件开发方法。

二、 核心概念

  1. 限界上下文:首先要将大系统划分为多个限界上下文,比如一个经销商电商系统可以划分为产品、经销商、订单等几个限界上下文,每个限界上下文有自己的领域逻辑、数据持久化、用例、接口等。每个限界上下文根据特点,具体实现方式又不同,比如有些限界上下文基本没有业务逻辑,就是增删改查,则可以使用 CRUD 最简单的模式;有些界限上线文有一定的业务逻辑,但对高并发、高性能没要求,则可以使用经典 DDD 模式;有些限界上下文有一定的业务逻辑,而且有高性能要求,则可以使 CQRS 模式。 划分限界上下文并且在每个上下文实现自己的业务逻辑、持久化、用例和接口作用是巨大大,一是可以让不同开发小组专注与此限界上下文的开发,二是可以分别部署,三是如果一个限界上下文出现问题,并不影响其他限界上下文功能的使用。
  2. 实体:有业务生命周期的对象,采用业务标识符进行跟踪。比如一个订单就是实体,订单有生命周期的,而且有一个订单号唯一的标识它自己,如果两个订单所有属性值全部相同,但订单号不同,也是不同的实体。
  3. 值对象:无业务生命周期,无业务标识符,通常用于描述实体。比如订单的收货地址、订单支付的金额等就是值对象。值对象在数据库中表的表现形式可以是两种,一种是作为一个列或多个列与所属的实体对象所对应的表放在一起,另一种是单独一个表,通过ID与所属的实体对象关联。
  4. 领域服务:无状态,有行为,通常就是一个用例来协调多个领域逻辑完成功能。
  5. 聚合:通常将多个实体和值对象组合到一个聚合中来表达一个完整的概念,比如订单实体、订单明细实体、订单金额值对象就代表一个完整的订单概念,而且生命周期是相同的,并且需要统一持久化到数据库中。
  6. 聚合根:将聚合中表达总概念的实体做成聚合根,比如订单实体就是聚合根,对聚合中所有实体的状态变更必须经过聚合根,因为聚合根协调了整个聚合的逻辑,保证一致性。当然其他实体可以被外部直接临时查询调用。
  7. 服务:协调聚合之间的业务逻辑,并且完成用例。
  8. 仓储:用于对聚合进行持久化,通常为每个聚合根配备一个仓储即可。仓储能够很好的解耦领域逻辑与数据库。

附件:参考资料

思维导图:

https://www.processon.com/view/59f2c100e4b0f84f89738e6b#map

https://www.processon.com/view/5e5b2876e4b0d4dc8776bd1d#map

https://www.processon.com/view/5d5a0407e4b06e4919178d66#map

https://www.processon.com/special/template/5e55d17ee4b069f82a120d06#map

https://www.processon.com/special/template/5eccb5381e08530a9b1f3b48#map

https://www.processon.com/view/5dca1ebfe4b022abb62fd20a?fromnew=1

《领域驱动设计精简版 InfoQ》

https://static001.infoq.cn/resource/ebook/bf/bd/bf54748a33643e667156110202082cbd.pdf

https://zhuanlan.zhihu.com/p/69056667